#ifndef PROPERTY_H_
#define PROPERTY_H_

#include <boost/variant.hpp>

#include "Vector2.h"
#include <string>

namespace EntitySystem
{

typedef boost::variant< int, float, std::string, Math::Vector2F > _property;
	
class Property
{
public:
	
	Property();

	Property(const Property& orig);
	
	virtual ~Property();
	
	/**
	 * Stores an integer in this property.
	 *
	 * @param x: to store.
	 */
	
	void StoreInt(int x);
	
	
	/**
	 * Interprets this property as an integer.
	 */
	
	int AsInt();
	
	
	/**
	 * Stores a float in this property.
	 *
	 * @param x: to store.
	 */

	void StoreFloat(float x);
	
	
	/**
	 * Interprets this property as a float.
	 *
	 * @return contents of this property as a float.
	 */

	float AsFloat();
	
	
	/**
	 * Stores a string in this property.
	 */
	
	void StoreString(const std::string &str);
	
	
	/**
	 * Interprets this property as a string.
	 *
	 * @return contents of this property as a string.
	 */
	
	std::string AsString();
	
	
	/**
	 * Stores a Vector in this property.
	 */
	
	void StoreVector(const Math::Vector2F& vector);
	
	
	/**
	 * Interprets this property as a Vector2F.
	 *  
	 * @return contents of this property as a Vector2F.
	 */
	
	Math::Vector2F* AsVector();
private:
    
    _property m_property;
};
	
};

#endif